import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

# 生成带有缺失值的虚拟数据集
np.random.seed(0)
x = np.linspace(0, 10, 20)
y = np.sin(x) + 0.5 * np.random.normal(size=len(x))

# 随机选择一部分数据置为空以模拟缺失
mask = np.random.choice([True, False], size=y.shape, p=[0.3, 0.7])
y_missing = y.copy()
y_missing[mask] = np.nan  # 将随机部分置为NaN模拟缺失值

# 使用线性插值填补缺失值
x_valid = x[~mask]  # 有效的x值（非NaN）
y_valid = y[~mask]  # 有效的y值（非NaN）

# 生成插值函数
linear_interp_func = interp1d(x_valid, y_valid, kind='linear', fill_value="extrapolate")
y_interpolated = linear_interp_func(x)  # 生成插值数据

# 计算插值误差（仅对原始非缺失位置）
error = np.abs(y - y_interpolated)


# 绘制图形
plt.figure(figsize=(12, 8))

# 图1：原始数据和插值数据对比
plt.subplot(3, 1, 1)
plt.plot(x, y, 'o-', color="royalblue", label='Original Data', alpha=0.6)
plt.plot(x, y_missing, 'o', color="tomato", label='Data with Missing Values', alpha=0.5)
plt.plot(x, y_interpolated, 'o--', color="forestgreen", label='Interpolated Data', alpha=0.7)
plt.title('Original Data, Missing Data, and Interpolated Data')
plt.legend()

# 图2：插值误差图
plt.subplot(3, 1, 2)
plt.plot(x, error, 's-', color="purple", markerfacecolor="yellow", label='Interpolation Error')
plt.title('Interpolation Error')
plt.xlabel('X')
plt.ylabel('Error')
plt.legend()

# 图3：插值数据的趋势
plt.subplot(3, 1, 3)
plt.plot(x, y_interpolated, 'o-', color="darkorange", label='Interpolated Data')
plt.title('Trend of Interpolated Data')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()

plt.tight_layout()
plt.show()